#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

#define MAXARGS	20		/* cmdline args */
#define ARGLEN	100		/* token length */

void execute(char *arglist[]);
char *makestring(char *);

int main() {
	char *arglist[MAXARGS + 1];
	int numargs;
	char argbuf[ARGLEN];
	char *makestring();

	numargs = 0;
	while (numargs < MAXARGS) {
		printf("Arg[%d]? ", numargs);
		if (fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n') {
			arglist[numargs++] = makestring(argbuf);
		} else {
			if (numargs > 0) {
				arglist[numargs] = '\0';
				execute(arglist);
				numargs = 0;
			}
		}
	}
	return 0;
}


/**
  * use fork() and execvp() to do it 
  */
void execute(char *arglist[]) {
	int pid, exitstatus;
	pid = fork();

	switch(pid) {
		case -1:
			perror("fork failed");
			exit(1);
		case 0:
			execvp(arglist[0], arglist);
			perror("execvp failed");
			exit(1);
		default:
			while (wait(&exitstatus) != pid);
			printf("child exited with status %d, %d\n", exitstatus >> 8, exitstatus & 0377);
				
	}
}



/**
  * trim off newline and create storage for the string
  */
char *makestring(char *buf) {
	char *cp;
	buf[strlen(buf) - 1] = '\0';
	cp = (char *)malloc(strlen(buf) + 1);
	if (cp == NULL) {
		fprintf(stderr, "no memory\n");
		exit(1);
	}
	strcpy(cp, buf);
	return cp;
}
